#ifndef _FINGER_API_H_
#define _FINGER_API_H_

#include "finger_board.h"

#if (_SAFETY_MODULE_TYPE_ == _FINGER_SAFETY_MODULE_) && (_SAFETY_VERIFYFUNCTION_ENABLE_)

/* 描述各字段长度 */
// 描述帧头字段长度
#define FINGER_FRAME_HEADE_BIT_LENGTH                     (8ul)
// 描述应用层数据长度字段长高
#define FINGER_APPLICATION_DATA_SIZE_BIT_LENGTH           (2ul)
// 描述CRC校验字段长度
#define FINGER_FRAME_HEADE_CRC_BIT_LENGTH                 (1ul)
// 校验密码字段长度
#define FINGER_PROTOCOL_PASSWORD_BIT_LENGTH               (4ul)
// 命令字段长度
#define FINGER_PROTOCOL_COMMAND_BIT_LENGTH                (2ul)
// 描述应答码字段长度
#define FINGER_PROTOCOL_ACK_BIT_LENGTH                    (4ul)

// 最大附带数据长度
#define FINGER_MAXIMUM_NUMBER_OF_DATA                     (512ul)

// 最大应用层数据长度
#define FINGER_APPLICATION_MAX_DATA_BIT_LENGTH            (128ul)
// 链路层固定参数长度
#define FINGER_LINK_LAYER_FIXED_PARAMETER_LENGTH          (11ul)
// 应用层固定参数长度（发送）
#define FINGER_APPLICATION_FIXED_PARAMETER_LENGTH_TX      (7ul)
// 应用层固定参数长度（接收）
#define FINGER_APPLICATION_FIXED_PARAMETER_LENGTH_RX      (11ul)

// 应用层固定参数字段长度(发送)
#define FINGER_TX_APPLICATION_DATA_LENGTH(_DATA_SIZE_)    (FINGER_APPLICATION_FIXED_PARAMETER_LENGTH_TX + _DATA_SIZE_)
// 应用层固定参数字段长度（接收）
#define FINGER_RX_APPLICATION_DATA_LENGTH(_DATA_SIZE_)    (FINGER_APPLICATION_FIXED_PARAMETER_LENGTH_RX + _DATA_SIZE_)

// 协议总长度（发送）
#define FINGER_TX_PROTOCOL_TOTAL_LENGTH(_DATA_SIZE_)      (FINGER_LINK_LAYER_FIXED_PARAMETER_LENGTH + FINGER_APPLICATION_FIXED_PARAMETER_LENGTH_TX + _DATA_SIZE_)
// 协议总长度（接收）
#define FINGER_RX_PROTOCOL_TOTAL_LENGTH(_DATA_SIZE_)      (FINGER_LINK_LAYER_FIXED_PARAMETER_LENGTH + FINGER_APPLICATION_FIXED_PARAMETER_LENGTH_RX + _DATA_SIZE_)
// 接收数据长度
#define FINGER_RX_PROTOCOL_DATA_LENGTH(_DATA_SIZE_)       (_DATA_SIZE_ - FINGER_APPLICATION_FIXED_PARAMETER_LENGTH_RX)

// 最大注册用户上限
#define FINGER_NUMBER_OF_REGISTERED_USERS                 (50ul)
// 特征值最大长度
#define FINGER_FEATURE_MAX_SIZE                           (8 * 1024)

// 最小指纹拼接次数
#define FINGER_MINIMUM_NUMBER_OF_CONCATENATIONS           (1ul)
// 最大指纹拼接次数
#define FINGER_MAXIMUM_NUMBER_OF_CONCATENATIONS           (6ul)

// 模组序列号长度
#define FINGER_MODULE_SN_LENGTH                           (16ul)
// 模组软件版本号长度
#define FINGER_LENGTH_OF_VERSION_INFORMATION              (4ul)

/**
 * @brief 应答码参考表
 *
 */
typedef enum
{
  NORMAL_COMPLETION,                                // 正常完成
  UNRECOGNIZABLE_COMMAND,                           // 无法识别的命令
  ILLEGAL_COMMAND_DATA_LENGTH,                      // 命令数据长度非法
  ILLEGAL_COMMAND_FIELD_DATA,                       // 命令字段数据非法
  SYSTEM_BUSY_CANNOT_EXECUTE_CURRENT_COMMAND,       // 系统忙， 无法执行当前命令
  QUERY_RESULT_WITHOUT_SENDING_THE_COMMAND_REQUEST, // 没有发送该命令的请求， 就查询结果
  SYSTEM_SOFTWARE_REPORTED_ERROR,                   // 系统软件上报错误
  HARDWARE_ERROR,                                   // 硬件错误
  NO_FINGER_PRESS_DETECTED,                         // 没有检测到手指按压， 超时退出
  FINGERPRINT_EXTRACTION_ERROR,                     // 指纹提取发生错误
  FINGERPRINT_MATCHING_ERROR,                       // 指纹匹配发生错误(指纹模板库为空)
  FINGERPRINT_DATA_STORAGE_SPACE_FULL,              // 指纹数据存储空间满
  STORAGE_WRITE_FAILURE,                            // 存储写入失败
  STORAGE_READ_FAILURE,                             // 存储读取失败
  COLLECTED_FINGERPRINT_IMAGE_QUALITY_IS_POOR,      // 采集的指纹图像质量不佳
  DUPLICATE_FINGERPRINT,                            // 指纹重复
  SCANNING_AREA_TOO_SMALL,                          // 采图面积太小
  FINGER_MOVEMENT_RANGE_TOO_LARGE_DURING_SCANNING,  // 采图时手指移动范围过大
  FINGER_MOVEMENT_RANGE_TOO_SMALL_DURING_SCANNING,  // 采图时手指移动范围过小
  FINGERPRINT_ID_OCCUPIED,                          // 指纹 ID 被占用
  MODULE_SCANNING_FAILURE,                          // 模组采图失败
  COMMAND_FORCED_INTERRUPTION,                      // 命令强制中断
  FINGERPRINT_FEATURE_DATA_DOES_NOT_NEED_UPDATE,    // 指纹特征数据不需要更新
  INVALID_FINGERPRINT_ID,                           // 无效指纹 ID
  GAIN_ADJUSTMENT_FAILURE,                          // 增益调整失败
  DATA_BUFFER_OVERFLOW,                             // 数据缓冲区溢出
  ERROR_RETURNED_WHEN_RECEIVING_SCAN,               // sensor 休眠状态下收到采图相关消息返回错误
} FingerAckCode_t;

/**
 * @brief 命令类型
 *
 */
typedef enum
{
  COMMAND_FINGERPRINT                             = 0x01, // 指纹类
  COMMAND_SYSTEM                                  = 0x02, // 系统类
  COMMAND_MAINTENANCE                             = 0x03, // 维护类
} FingerCommandType_t;

/**
 * @brief 主命令参考表
 *
 */
typedef enum
{
  // 指纹类
  FINGER_REGISTRATION                             = 0x11, // 指纹注册
  FINGER_QUERY_REGISTRATION_RESULT                = 0x12, // 查询注册结果
  FINGER_SAVE_TEMPLATE                            = 0x13, // 保存指纹
  FINGER_QUERY_SAVE_RESULT                        = 0x14, // 查询保存指纹结果
  FINGER_CANCEL_REGISTRATION                      = 0x15, // 取消指纹注册
  FINGER_UPDATE_STORAGE_FEATURE_VALUE             = 0x16, // 更新存储特征值
  FINGER_VIEW_STORAGE_FEATURE_VALUE_UPDATE_RESULT = 0x17, // 查看存储特征值更新结果
  FINGER_AUTO_REGISTRATION                        = 0x18, // 自动注册
  FINGER_MATCHING                                 = 0x21, // 指纹匹配
  FINGER_QUERY_MATCHING_RESULT                    = 0x22, // 查询匹配结果
  FINGER_MATCHING_SYNCHRONOUS                     = 0x23, // 指纹匹配（同步）
  FINGER_FEATURE_CLEARANCE                        = 0x31, // 指纹特征清除
  FINGER_QUERY_FEATURE_CLEARANCE_RESULT           = 0x32, // 查询指纹特征清除结果
  FINGER_QUERY_ENCODING_EXISTENCE                 = 0x33, // 查询指纹编码是否存在
  FINGER_QUERY_STORAGE_DISTRIBUTION               = 0x34, // 查询指纹存储分布
  FINGER_QUERY_FINGER_ONLINE_STATUS               = 0x35, // 查询手指在位状态
  FINGER_FEATURE_CLEARANCE_SYNCHRONOUS            = 0x36, // 指纹特征清除（同步）
  FINGER_REGISTER_CONFIRMATION                    = 0x41, // 注册指纹确认
  FINGER_QUERY_REGISTER_CONFIRMATION_RESULT       = 0x42, // 查询注册指纹确认结果
  FINGER_FEATURE_INFORMATION_DOWNLOAD             = 0x51, // 指纹特征信息下载
  FINGER_FEATURE_DATA_DOWNLOAD                    = 0x52, // 指纹特征数据下载
  FINGER_FEATURE_INFORMATION_UPLOAD               = 0x53, // 指纹特征信息上传
  FINGER_FEATURE_DATA_UPLOAD                      = 0x54, // 指纹特征数据上传
  // 系统类
  FINGER_PASSWORD_SETTING                         = 0x01, // 密码设置
  FINGER_RESET_MODULE                             = 0x02, // 复位模块
  FINGER_GET_TEMPLATE_QUANTITY                    = 0x03, // 获取指纹模板数量
  FINGER_GET_GAIN                                 = 0x09, // 获取增益
  FINGER_GET_MATCHING_THRESHOLD                   = 0x0B, // 获取匹配门限
  FINGER_SLEEP_MODE                               = 0x0C, // 休眠模式
  FINGER_SET_MAXIMUM_REGISTRATION_TIMES           = 0x0D, // 设置最大注册次数
  FINGER_SET_LED_CONTROL_INFORMATION              = 0x0F, // 设置LED控制信息
  FINGER_GET_SYSTEM_STRATEGY                      = 0xFB, // 获取系统策略
  FINGER_SET_SYSTEM_STRATEGY                      = 0xFC, // 设置系统策略
  // 维护类
  FINGER_READ_DEVICE_ENCODING                     = 0x01, // 读取设备编码
  FINGER_HEARTBEAT                                = 0x03, // 心跳
  FINGER_SET_BAUD_RATE                            = 0x04, // 设置波特率
  FINGER_SET_COMMUNICATION_PASSWORD               = 0x05, // 设置通讯密码
  FINGER_GET_FIRMWARE_VERSION                     = 0x06, // 获取应用程序版本
} FingerProtocolCommand_t;

/**
 * @brief 定义指示灯模式
 *
 */
typedef enum
{
  FINGER_LED_CTRL_OFF                             = 0x00, // 关闭LED
  FINGER_LED_CTRL_ON                              = 0x01, // 开启LED
  FINGER_LED_CTRL_PWN                             = 0x03, // PWM控制
  FINGER_LED_CTRL_BLINK                           = 0x04, // 闪烁LED灯
} FingerLedContorlType_t;

/**
 * @brief 定义指示灯颜色
 *
 */
typedef enum
{
  FINGER_LED_HINT_NONE                            = 0x00, // 无颜色控制
  FINGER_LED_HINT_GREEN                           = 0x01, // 绿色
  FINGER_LED_HINT_RED                             = 0x02, // 红色
  FINGER_LED_HINT_GREEN_WITH_RED                  = 0x03, // 红色+绿色（黄色）
  FINGER_LED_HINT_BLUE                            = 0x04, // 蓝色
  FINGER_LED_HINT_RED_WITH_BLUE                   = 0x05, // 红色+蓝色（粉色）
  FINGER_LED_HINT_GREEN_WITH_BLUE                 = 0x06, // 绿色+蓝色（青色）
  FINGER_LED_HINT_LED_ALL                         = 0x07, // 红色+蓝色+绿色（白色）
} FingerLedHintMode_t;

/**
 * @brief 定义睡眠模式
 *
 */
typedef enum
{
  FINGER_SLEEP_MODE_0                             = 0x00, // 普通睡眠可通过按压sensor唤醒模组
  FINGER_SLEEP_MODE_1                             = 0x01, // 深度睡眠，需要通过复位来唤醒
} FingerSleepMode_t;

/**
 * @brief 定义删除特征模式
 *
 */
typedef enum
{
  FINGER_DELETE_ONLY                              = 0x00, // 删除单个用户
  FINGER_DELETE_ALL_USER                          = 0x01, // 删除所有用户
  FINGER_DELETE_CODE_MASK                         = 0x02, // 根据编码删除
  FINGER_DELETE_BLOCK                             = 0x03, // 块删除
} FingerDeleteMode_t;

/**
 * @brief 系统策略
 *
 */
typedef enum
{
  SYS_POLICY_MERGE_CONTROL, // 合并指纹限制
  SYS_POLICY_REPEAT_CHECK,  // 重复指纹检查
  SYS_POLICY_SELF_LEARN,    // 自学习功能
  SYS_POLICY_AUTO_SLEEP,    // 自动睡眠功能
  SYS_POLICY_360_IDENTIFY,  // 360度识别
  SYS_POLICY_UART_WAKEUP,   // 串口唤醒
  SYS_POLICY_AUTO_CTRL_LED, // 自动控制LED
} FingerSysPolicy_t;

/**
 * @brief 指纹模块协议格式（发送）
 *
 */
typedef struct
{
  // 链路层参数
  uint8_t FrameHead[FINGER_FRAME_HEADE_BIT_LENGTH];          // 帧头
  uint8_t DataSize[FINGER_APPLICATION_DATA_SIZE_BIT_LENGTH]; // 应用层数据长度
  uint8_t FramHeadeCrc;                                      // 帧头校验
  // 应用层参数
  uint8_t Password[FINGER_PROTOCOL_PASSWORD_BIT_LENGTH]; // 校验密码
  uint8_t MasterCommand;                                 // 主命令
  uint8_t SubCommand;                                    // 从命令
  uint8_t Data[FINGER_MAXIMUM_NUMBER_OF_DATA];           // 数据
} FingerTxProtocolFormat_t;

/**
 * @brief 指纹模块协议格式（接收）
 *
 */
typedef struct
{
  // 链路层参数
  uint8_t FrameHead[FINGER_FRAME_HEADE_BIT_LENGTH];          // 帧头
  uint8_t DataSize[FINGER_APPLICATION_DATA_SIZE_BIT_LENGTH]; // 应用层数据长度
  uint8_t FramHeadeCrc;                                      // 帧头校验
  // 应用层参数
  uint8_t Password[FINGER_PROTOCOL_PASSWORD_BIT_LENGTH]; // 校验密码
  uint8_t MasterCommand;                                 // 主命令
  uint8_t SubCommand;                                    // 从命令
  uint8_t AckCode[FINGER_PROTOCOL_ACK_BIT_LENGTH];       // 应答码
  uint8_t Data[FINGER_MAXIMUM_NUMBER_OF_DATA];           // 数据
} FingerRxProtocolFormat_t;

/**
 * @brief 计算校验码
 *
 * @param pDataIn  - 待计算数据
 * @param DataSize - 数据长度
 * @return uint8_t - 校验码
 */
extern uint8_t FingerCalculateCrcValue(const uint8_t *pDataIn, uint16_t DataSize);

/**
 * @brief 构建用户注册报文
 *
 * @param RegisterCount - 注册次数
 * @param pDataOut      - 协议层数据
 * @param pSizeOut      - 协议层数据长度
 * @return bool         - 构建结果（true-成功，false-失败）
 */
extern bool FinigerBuildTheUserRegistrationMessage(uint8_t RegisterCount, void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建查询注册结果报文
 *
 * @param pDataOut - 协议层数据
 * @param pSizeOut - 协议层数据长度
 * @return bool    - 构建结果（true-成功，false-失败）
 */
extern bool FingerQueryRegistrationResultMessage(void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建保存指纹模板报文
 *
 * @param TemplateUser - 模板编码
 * @param pDataOut     - 协议层数据
 * @param pSizeOut     - 协议层数据长度
 * @return bool        - 构建结果（true-成功，false-失败）
 */
extern bool FingerSaveFingerprintTemplateMessage(uint16_t TemplateId, void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建查询保存指纹结果报文
 *
 * @param pDataOut - 协议层数据
 * @param pSizeOut - 协议层数据长度
 * @return bool    - 构建结果（true-成功，false-失败）
 */
extern bool FingerBuildGetSaveFingerprintTemplateResultMessage(void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建取消当前动作报文
 *
 * @param pDataOut - 协议层数据
 * @param pSizeOut - 协议层数据长度
 * @return bool    - 构建结果（true-成功，false-失败）
 */
extern bool FingerBuildCancelTheCurrentActionMessage(void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建更新存储特征值报文
 *
 * @param pDataOut - 协议层数据
 * @param pSizeOut - 协议层数据长度
 * @return bool    - 构建结果（true-成功，false-失败）
 */
extern bool FingerBuildUpdateStorageFeatureValueMessage(uint16_t TemplateId, void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建查看特征更新结果报文
 *
 * @param pDataOut - 协议层数据
 * @param pSizeOut - 协议层数据长度
 * @return bool    - 构建结果（true-成功，false-失败）
 */
extern bool FingerBuildCheckFeatureUpdateResultMessage(void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建自动注册报文
 *
 * @param WaitFinger - 是否等待手指
 * @param PressTimes - 按压次数
 * @param TemplateId - 模板编码
 * @param pDataOut   - 协议层数据
 * @param pSizeOut   - 协议层数据长度
 * @return bool      - 构建结果（true-成功，false-失败）
 */
extern bool FingerBuildAutomaticRegistrationMessage(bool WaitFinger, uint8_t PressTimes, uint16_t TemplateId, void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建指纹匹配报文
 *
 * @param pDataOut - 协议层数据
 * @param pSizeOut - 协议层数据长度
 * @return bool    - 构建结果（true-成功，false-失败）
 */
extern bool FingerBuildMatchingMessage(void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建查询匹配结果报文
 *
 * @param pDataOut - 协议层数据
 * @param pSizeOut - 协议层数据长度
 * @return bool    - 构建结果（true-成功，false-失败）
 */
extern bool FingerBuildQueryMatchingResultMessage(void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建指纹匹配（同步）报文
 *
 * @param pDataOut - 协议层数据
 * @param pSizeOut - 协议层数据长度
 * @return bool    - 构建结果（true-成功，false-失败）
 */
extern bool FingerBuildMatchingSynchronousMessage(void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建特征值清除报文
 *
 * @param Mode - 清除模式
 * @param pTemplateIdIn  - 待删除模板编码（起始）
 * @param NumberOfDelete - 待删除模板数量
 * @param pDataOut       - 协议层数据
 * @param pSizeOut       - 协议层数据长度
 * @return bool          - 构建结果（true-成功，false-失败）
 */
extern bool FingerBuildFeatureClearanceMessage(FingerDeleteMode_t Mode, uint16_t *pTemplateIdIn, uint8_t NumberOfDelete, void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建指纹特征清除报文
 *
 * @param pDataOut - 协议层数据
 * @param pSizeOut - 协议层数据长度
 * @return bool    - 构建结果（true-成功，false-失败）
 */
extern bool FingerBuildQueryFeatureClearanceResultMessage(void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建查询指纹编码是否存在报文
 *
 * @param pDataOut - 协议层数据
 * @param pSizeOut - 协议层数据长度
 * @return bool    - 构建结果（true-成功，false-失败）
 */
extern bool FingerBuildQueryEncodingExistenceMessage(uint16_t TemplateId, void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建查询指纹存储分布报文
 *
 * @param pDataOut - 协议层数据
 * @param pSizeOut - 协议层数据长度
 * @return bool    - 构建结果（true-成功，false-失败）
 */
extern bool FingerBuildQueryStorageDistributionMessage(void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建查询手指在位状态报文
 *
 * @param pDataOut - 协议层数据
 * @param pSizeOut - 协议层数据长度
 * @return bool    - 构建结果（true-成功，false-失败）
 */
extern bool FingerBuildQueryFingerOnlineStatusMessage(void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建指纹特征清除（同步）报文
 *
 * @param Mode - 清除模式
 * @param pTemplateIdIn  - 待删除模板编码（起始）
 * @param NumberOfDelete - 待删除模板数量
 * @param pDataOut       - 协议层数据
 * @param pSizeOut       - 协议层数据长度
 * @return bool          - 构建结果（true-成功，false-失败）
 */
extern bool FingerBuildFeatureClearanceSynchronousMessage(FingerDeleteMode_t Mode, uint16_t *pTemplateIdIn, uint8_t NumberOfDelete, void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建注册指纹确认报文
 *
 * @param pDataOut - 协议层数据
 * @param pSizeOut - 协议层数据长度
 * @return bool    - 构建结果（true-成功，false-失败）
 */
extern bool FingerBuildRegisterConfirmationMessage(void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建查询注册指纹确认结果报文
 *
 * @param pDataOut - 协议层数据
 * @param pSizeOut - 协议层数据长度
 * @return bool    - 构建结果（true-成功，false-失败）
 */
extern bool FingerBuildQueryRegisterConfirmationResultMessage(void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建指纹特征信息下载报文
 *
 * @param TemplateId  - 模板编码
 * @param FeatureSize - 特征长度
 * @param pDataOut    - 协议层数据
 * @param pSizeOut    - 协议层数据长度
 * @return bool       - 构建结果（true-成功，false-失败）
 */
extern bool FingerBuildFeatureInformationDownloadMessage(uint16_t TemplateId, uint16_t FeatureSize, void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建指纹特征数据下载报文
 *
 * @param DataOffset - 下载文件偏移地址
 * @param pFeatureIn - 特征数据
 * @param DataSize   - 特征数据长度
 * @param pDataOut   - 协议层数据
 * @param pSizeOut   - 协议层数据长度
 * @return bool      - 构建结果（true-成功，false-失败）
 */
extern bool FingerBuildFeatureDataDownloadMessage(uint16_t DataOffset, const uint8_t *pFeatureIn, uint8_t DataSize, void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建指纹特征信息上传报文
 *
 * @param TemplateId - 模板编码
 * @param pDataOut   - 协议层数据
 * @param pSizeOut   - 协议层数据长度
 * @return bool      - 构建结果（true-成功，false-失败）
 */
extern bool FingerBuildFeatureInformationUploadMessage(uint16_t TemplateId, void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建指纹特征数据上传报文
 *
 * @param DataOffset - 上传文件偏移地址
 * @param pDataOut   - 协议层数据
 * @param pSizeOut   - 协议层数据长度
 * @return bool      - 构建结果（true-成功，false-失败）
 * @note  单次上传最大长度为128字节
 */
extern bool FingerBuildFeatureDataUploadMessage(uint16_t DataOffset, void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建密码设置报文
 *
 * @param Password - 密码
 * @param pDataOut - 协议层数据
 * @param pSizeOut - 协议层数据长度
 * @return bool    - 构建结果（true-成功，false-失败）
 */
extern bool FingerBuildPasswordSettingMessage(uint8_t *pPasswordIn, void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建复位模块报文
 *
 * @param pDataOut - 协议层数据
 * @param pSizeOut - 协议层数据长度
 * @return bool    - 构建结果（true-成功，false-失败）
 */
extern bool FingerBuildResetModuleMessage(void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建获取指纹模板数量报文
 *
 * @param pDataOut - 协议层数据
 * @param pSizeOut - 协议层数据长度
 * @return bool    - 构建结果（true-成功，false-失败）
 */
extern bool FingerBuildGetTemplateQuantityMessage(void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建获取增益报文
 *
 * @param pDataOut - 协议层数据
 * @param pSizeOut - 协议层数据长度
 * @return bool    - 构建结果（true-成功，false-失败）
 */
extern bool FingerBuildGetGainMessage(void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建获取匹配门限报文
 *
 * @param pDataOut - 协议层数据
 * @param pSizeOut - 协议层数据长度
 * @return bool    - 构建结果（true-成功，false-失败）
 */
extern bool FingerBuildGetMatchingThresholdMessage(void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建休眠模式报文
 *
 * @param SleepMode - 休眠模式
 * @param pDataOut  - 协议层数据
 * @param pSizeOut  - 协议层数据长度
 * @return bool     - 构建结果（true-成功，false-失败）
 */
extern bool FingerBuildSleepModeMessage(FingerSleepMode_t Mode, void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建设置最大拼接次数报文
 *
 * @param Times    - 最大拼接次数
 * @param pDataOut - 协议层数据
 * @param pSizeOut - 协议层数据长度
 * @return bool    - 构建结果（true-成功，false-失败）
 */
extern bool FingerBuildSetMaximumRegistrationTimesMessage(uint8_t Times, void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建设置 LED 控制信息报文
 *
 * @param LedCtrlType - 控制模式
 * @param LedHintMode - 灯光颜色
 * @param Parameter1  - 参数 1
 * @param Parameter2  - 参数 2
 * @param Parameter3  - 参数 3
 * @param pDataOut    - 协议层数据
 * @param pSizeOut    - 协议层数据长度
 * @return bool       - 构建结果（true-成功，false-失败）
 */
extern bool FingerBuildSetLedControlInformationMessage(FingerLedContorlType_t LedCtrlType, FingerLedHintMode_t LedHintMode, uint8_t Parameter1, uint8_t Parameter2, uint8_t Parameter3, void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建获取系统策略报文
 *
 * @param pDataOut - 协议层数据
 * @param pSizeOut - 协议层数据长度
 * @return bool    - 构建结果（true-成功，false-失败）
 */
extern bool FingerBuildGetSystemStrategyMessage(void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建设置系统策略报文
 *
 * @param Policy   - 系统策略
 * @param pDataOut - 协议层数据
 * @param pSizeOut - 协议层数据长度
 * @return bool    - 构建结果（true-成功，false-失败）
 */
extern bool FingerBuildSetSystemStrategyMessage(uint32_t Policy, void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建读取设备编码报文
 *
 * @param Policy   - 系统策略
 * @param pDataOut - 协议层数据
 * @param pSizeOut - 协议层数据长度
 * @return bool    - 构建结果（true-成功，false-失败）
 */
extern bool FingerBuildReadDeviceEncodingMessage(void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建心跳报文
 *
 * @param pDataOut - 协议层数据
 * @param pSizeOut - 协议层数据长度
 * @return bool    - 构建结果（true-成功，false-失败）
 */
extern bool FingerBuildHeartbeatMessage(void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建设置波特率报文
 *
 * @param BaudRate - 波特率
 * @param pDataOut - 协议层数据
 * @param pSizeOut - 协议层数据长度
 * @return bool    - 构建结果（true-成功，false-失败）
 */
extern bool FingerBuildSetBaudRateMessage(uint32_t BaudRate, void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建设置通讯密码报文
 *
 * @param pPasswordIn - 密码
 * @param pDataOut    - 协议层数据
 * @param pSizeOut    - 协议层数据长度
 * @return bool       - 构建结果（true-成功，false-失败）
 */
extern bool FingerBuildSetCommunicationPasswordMessage(uint8_t *pPasswordIn, void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 构建获取应用程序版本报文
 *
 * @param pDataOut - 协议层数据
 * @param pSizeOut - 协议层数据长度
 * @return bool    - 构建结果（true-成功，false-失败）
 */
extern bool FingerBuildGetFirmwareVersionMessage(void *pDataOut, uint16_t *pSizeOut);

/**
 * @brief 解析指纹注册报文
 *
 * @param pMessageIn - 待解析报文
 * @return bool      - 解析结果（true-成功，false-失败）
 */
extern bool FingerParseRegistrationMessage(const uint8_t *pMessageIn);

/**
 * @brief 解析查询注册结果报文
 *
 * @param pMessageIn     - 待解析报文
 * @param pTemplateIdOut - 模板编码
 * @param pProgressOut   - 进度
 * @return bool          - 解析结果（true-成功，false-失败）
 */
extern bool FingerParseQueryRegistrationResultMessage(const uint8_t *pMessageIn, uint16_t *pTemplateIdOut, uint8_t *pProgressOut);

/**
 * @brief 解析保存指纹模板报文
 *
 * @param pMessageIn - 待解析报文
 * @return bool      - 解析结果（true-成功，false-失败）
 */
extern bool FingerParseSaveFingerprintTemplateMessage(const uint8_t *pMessageIn);

/**
 * @brief 解析查询保存指纹结果报文
 *
 * @param pMessageIn     - 待解析报文
 * @param pTemplateIdOut - 模板编码
 * @return bool          - 解析结果（true-成功，false-失败）
 */
extern bool FingerParseQuerySaveFingerprintTemplateResultMessage(const uint8_t *pMessageIn, uint16_t *pTemplateIdOut);

/**
 * @brief 解析退出指纹注册或匹配报文
 *
 * @param pMessageIn - 待解析报文
 * @return bool      - 解析结果（true-成功，false-失败）
 */
extern bool FingerParseCancelRegistrationOrMatchingMessage(const uint8_t *pMessageIn);

/**
 * @brief 解析更新存储特征值报文
 *
 * @param pMessageIn - 待解析报文
 * @return bool      - 解析结果（true-成功，false-失败）
 */
extern bool FingerParseUpdateStorageFeatureValueMessage(const uint8_t *pMessageIn);

/**
 * @brief 解析查看特征更新结果报文
 *
 * @param pMessageIn - 待解析报文
 * @return bool      - 解析结果（true-成功，false-失败）
 */
extern bool FingerParseCheckFeatureUpdateResultMessage(const uint8_t *pMessageIn);

/**
 * @brief 解析自动注册报文
 *
 * @param pMessageIn        - 待解析报文
 * @param pRegisterCountOut - 注册次数
 * @param pTemplateIdOut    - 模板编码
 * @param pProgressOut      - 进度
 * @return bool             - 解析结果（true-成功，false-失败）
 */
extern bool FingerParseAutomaticRegistrationMessage(const uint8_t *pMessageIn, uint8_t *pRegisterCountOut, uint16_t *pTemplateIdOut, uint8_t *pProgressOut);

/**
 * @brief 解析指纹匹配报文
 *
 * @param pMessageIn - 待解析报文
 * @return bool      - 解析结果（true-成功，false-失败）
 */
extern bool FingerParseMatchingMessage(const uint8_t *pMessageIn);

/**
 * @brief 解析查询匹配结果报文
 *
 * @param pMessageIn      - 待解析报文
 * @param pMatchResultOut - 匹配结果
 * @param pMatchScoreOut  - 匹配分数
 * @param pTemplateIdOut  - 模板编码
 * @return bool           - 解析结果（true-成功，false-失败）
 */
extern bool FingerParseQueryMatchingResultMessage(const uint8_t *pMessageIn, uint16_t *pMatchResultOut, uint16_t *pMatchScoreOut, uint16_t *pTemplateIdOut);

/**
 * @brief 解析指纹特征清除报文
 *
 * @param pMessageIn - 待解析报文
 * @return bool      - 解析结果（true-成功，false-失败）
 */
extern bool FingerParseFeatureClearanceMessage(const uint8_t *pMessageIn);

/**
 * @brief 解析查询指纹特征清除结果报文
 *
 * @param pMessageIn - 待解析报文
 * @return bool      - 解析结果（true-成功，false-失败）
 */
extern bool FingerParseQueryFeatureClearanceResultMessage(const uint8_t *pMessageIn);

/**
 * @brief 解析查询指纹编码是否存在报文
 *
 * @param pMessage       - 待解析报文
 * @param pStatusOut     - 状态
 * @param pTemplateIdOut - 模板编码
 * @return bool          - 解析结果（true-成功，false-失败）
 */
extern bool FingerParseQueryFingerIdExistenceMessage(const uint8_t *pMessageIn, uint8_t *pStatusOut, uint16_t *pTemplateIdOut);

/**
 * @brief 解析查询指纹存储分布报文
 *
 * @param pMessageIn           - 待解析报文
 * @param pNumberOfRegisterOut - 已注册用户数量
 * @param TemplateIdOut        - 模板编码
 * @return bool                - 解析结果（true-成功，false-失败）
 */
extern bool FingerParseQueryStorageDistributionMessage(const uint8_t *pMessageIn, uint16_t *pNumberOfRegisterOut, uint8_t TemplateIdOut[8]);

/**
 * @brief 解析查询指纹在位状态报文
 *
 * @param pMessageIn - 待解析报文
 * @param pStatusOut - 在位状态
 * @return bool      - 解析结果（true-成功，false-失败）
 */
extern bool FingerParseQueryFingerOnlineStatusMessage(const uint8_t *pMessageIn, uint8_t *pStatusOut);

/**
 * @brief 解析指纹特征清除（同步）报文
 *
 * @param pMessageIn - 待解析报文
 * @return bool      - 解析结果（true-成功，false-失败）
 */
extern bool FingerParseFeatureClearanceSynchronousMessage(const uint8_t *pMessageIn);

/**
 * @brief 解析注册指纹确认报文
 *
 * @param pMessageIn - 待解析报文
 * @return bool      - 解析结果（true-成功，false-失败）
 */
extern bool FingerParseRegisterConfirmationMessage(const uint8_t *pMessageIn);

/**
 * @brief 解析查询注册指纹确认结果报文
 *
 * @param pMessageIn      - 待解析报文
 * @param pMatchResultOut - 匹配结果
 * @param pMatchScoreOut  - 匹配分数
 * @param pTemplateIdOut  - 模板编码
 * @return bool           - 解析结果（true-成功，false-失败）
 */
extern bool FingerParseQueryRegisterConfirmationResultMessage(const uint8_t *pMessageIn, uint16_t *pMatchResultOut, uint16_t *pMatchScoreOut, uint16_t *pTemplateIdOut);

/**
 * @brief 解析指纹特征信息下载报文
 *
 * @param pMessageIn - 待解析报文
 * @return bool      - 解析结果（true-成功，false-失败）
 */
extern bool FingerParseFeatureInformationDownloadMessage(const uint8_t *pMessageIn);

/**
 * @brief 解析指纹特征数据下载报文
 *
 * @param pMessageIn - 待解析报文
 * @return bool      - 解析结果（true-成功，false-失败）
 */
extern bool FingerParseFeatureDataDownloadMessage(const uint8_t *pMessageIn);

/**
 * @brief 解析指纹特征信息上传报文
 *
 * @param pMessageIn      - 待解析报文
 * @param pFeatureSizeOut - 特征值文件大小
 * @return bool           - 解析结果（true-成功，false-失败）
 */
extern bool FingerParseFeatureInformationUploadMessage(const uint8_t *pMessageIn, uint16_t *pFeatureSizeOut);

/**
 * @brief 解析指纹特征数据上传报文
 *
 * @param pMessageIn      - 待解析报文
 * @param pDataOffsetOut  - 数据偏移地址
 * @param pDataOut        - 特征值数据
 * @return bool           - 解析结果（true-成功，false-失败）
 */
extern bool FingerParseFeatureDataUploadMessage(const uint8_t *pMessageIn, uint16_t *pDataOffsetOut, uint8_t *pDataOut);

/**
 * @brief 解析指纹密码设置报文
 *
 * @param pMessageIn - 待解析报文
 * @return bool      - 解析结果（true-成功，false-失败）
 */
extern bool FingerParsePasswordSettingMessage(const uint8_t *pMessageIn);

/**
 * @brief 解析指纹模块复位报文
 *
 * @param pMessageIn - 待解析报文
 * @return bool      - 解析结果（true-成功，false-失败）
 */
extern bool FingerParseResetModuleMessage(const uint8_t *pMessageIn);

/**
 * @brief 解析查询指纹模板数量报文
 *
 * @param pMessageIn           - 待解析报文
 * @param pTemplateQuantityOut - 指纹模板数量
 * @return bool                - 解析结果（true-成功，false-失败）
 */
extern bool FingerParseGetTemplateQuantityMessage(const uint8_t *pMessageIn, uint8_t *pTemplateQuantityOut);

/**
 * @brief 解析查询增益报文
 *
 * @param pMessageIn  - 待解析报文
 * @param pShiftOut   -
 * @param pGainOut    - 增益值
 * @param pPxlCtrlOut -
 * @return bool       - 解析结果（true-成功，false-失败）
 */
extern bool FingerParseGetGainMessage(const uint8_t *pMessageIn, uint8_t *pShiftOut, uint8_t *pGainOut, uint8_t *pPxlCtrlOut);

/**
 * @brief 解析查询匹配阈值报文
 *
 * @param pMessageIn    - 待解析报文
 * @param pThresholdOut - 阈值
 * @return bool         - 解析结果（true-成功，false-失败）
 */
extern bool FingerParseGetMatchingThresholdMessage(const uint8_t *pMessageIn, uint16_t *pThresholdOut);

/**
 * @brief 解析设置休眠模式报文
 *
 * @param pMessageIn - 待解析报文
 * @return bool      - 解析结果（true-成功，false-失败）
 */
extern bool FingerParseSetSleepModeMessage(const uint8_t *pMessageIn);

/**
 * @brief 解析设置最大注册次数报文
 *
 * @param pMessageIn - 待解析报文
 * @return bool      - 解析结果（true-成功，false-失败）
 */
extern bool FingerParseSetMaximumRegistrationTimesMessage(const uint8_t *pMessageIn);

/**
 * @brief 解析设置 LED 控制信息
 *
 * @param pMessageIn - 待解析报文
 * @return bool      - 解析结果（true-成功，false-失败）
 */
extern bool FingerParseSetLedControlInformationMessage(const uint8_t *pMessageIn);

/**
 * @brief 解析设置系统策略报文
 *
 * @param pMessageIn - 待解析报文
 * @param pPolicyOut - 系统策略
 * @return bool      - 解析结果（true-成功，false-失败）
 */
extern bool FingerParseGetSystemStrategyMessage(const uint8_t *pMessageIn, uint32_t *pPolicyOut);

/**
 * @brief 解析设置系统策略报文
 *
 * @param pMessageIn - 待解析报文
 * @return bool      - 解析结果（true-成功，false-失败）
 */
extern bool FingerParseSetSystemStrategyMessage(const uint8_t *pMessageIn);

/**
 * @brief 解析获取指纹模块 ID 报文
 *
 * @param pMessageIn   - 待解析报文
 * @param pModuleIdOut - 模板唯一序列号
 * @return bool        - 解析结果（true-成功，false-失败）
 */
extern bool FingerParseGetModuleIdMessage(const uint8_t *pMessageIn, void *pModuleIdOut);

/**
 * @brief 解析心跳报文
 *
 * @param pMessageIn - 待解析报文
 * @return bool      - 解析结果（true-成功，false-失败）
 */
extern bool FingerParseHeartbeatMessage(const uint8_t *pMessageIn);

/**
 * @brief 解析设置波特率报文
 *
 * @param pMessageIn - 待解析报文
 * @return bool      - 解析结果（true-成功，false-失败）
 */
extern bool FingerParseSetBaudRateMessage(const uint8_t *pMessageIn);

/**
 * @brief 解析设置通讯密码报文
 *
 * @param pMessageIn - 待解析报文
 * @return bool      - 解析结果（true-成功，false-失败）
 */
extern bool FingerParseSetCommunicationPasswordMessage(const uint8_t *pMessageIn);

/**
 * @brief 解析获取固件版本号报文
 *
 * @param pMessageIn                - 待解析报文
 * @param pFirmwareVersionNumberOut - 固件版本号
 * @return bool                     - 解析结果（true-成功，false-失败）
 */
extern bool FingerParseGetFirmwareVersionNumberMessage(const uint8_t *pMessageIn, void *pFirmwareVersionNumberOut);

#endif
#endif
